#include <cstdio>
#include <string>
using namespace std;

// 拷贝构造函数

class Stu{
    private:
    int id;
    string name;
    public:
    int getId(){
        return id;
    }
    string getName(){
        return name;
    }
    Stu(){ 
        printf("default constructor\n");
    }
    Stu(int sid,string sname){
        id=sid;
        name=sname;
        printf("arrguments constructor\n");
    }
    Stu(const Stu & s){
        printf("copy constructor\n");
    }
    ~Stu(){
        printf("bye");
    }
};

void func(Stu s){
    printf("func\n");
}

Stu func2(){
    printf("func2\n");
    Stu s;
    printf("%p \n",&s);
    return s;
}

// 拷贝构造函数调用时机
void constructorTest(){
    Stu s1;
    Stu s2(1,"ANN");
    // 使用一个已经创建完毕的对象来初始化一个新对象
    Stu s3(s2);
    // 值传递的方式给函数参数传值, 接受参数时会创建一个新的对象
    func(s1);
    // 以值方式返回局部对象, 返回数据时会创建一个新的对象
    Stu s4 = func2();
    printf("%p \n",&s4);
}

// 深拷贝与浅拷贝
void deepCopy(){
    Stu s1(1,"ANN");
    printf("id: %d, name: %s\n",s1.getId(),s1.getName().c_str());
}

int main(){
    constructorTest();
    deepCopy();
    return 0;
}